package cn.northsea.cut;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Aspect//声明当前类是切面类
@Component//将该类扫描到spring容器里
public class Cut {

    //首先创建切入点
    //*表示是对所有被public修饰得方法进行切入
    //com.lzx.service.*.*(..) 对业务层包下的所有方法进行切入
    @Pointcut("execution(* cn.northsea.service.*.*(..))")
    public void cut() {

    }

//    //配置通知
//    @Before("cut()")
//    public void before() {
//        System.out.println("前置通知");
//    }
//
//    @AfterReturning("cut()")
//    public void afterReturning() {
//        //当没有出现异常时，返回通知
//        System.out.println("返回通知");
//    }
//
//    @After("cut()")
//    public void after() {
//        System.out.println("最终通知");
//        //无论有没有异常都会执行的通知
//    }
//
//    @AfterThrowing("cut()")
//    public void afterThrowing() {
//        System.out.println("异常通知");
//    }

    @Around("cut()")//将以上四个通知整合了
    public Object around(ProceedingJoinPoint proceedingJoinPoint) {
        System.out.println("前置通知");
        Object proceed = null;
        try {
            long start = System.currentTimeMillis();
            proceed = proceedingJoinPoint.proceed();
            String name = proceedingJoinPoint.getTarget().getClass().getName();
            System.out.println("被增强得类：" + name);
            String name1 = proceedingJoinPoint.getSignature().getName();
            System.out.println("被增强得方法：" + name1);
            System.out.println("被增强得方法参数：" + Arrays.toString(proceedingJoinPoint.getArgs()));
            long end = System.currentTimeMillis();
            System.out.println("总耗时：" + (end - start) + "毫秒");
        } catch (Throwable throwable) {
            System.out.println("异常通知");
            throwable.printStackTrace();
        } finally {
            System.out.println("最终通知");
        }
        System.out.println("返回通知");
        return proceed;
    }
}
